package com.itany.corejava.code16_反射;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Properties;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年12月19日 10:32
 */
public class EmpFactory {
    private static Properties p;

    static {
        p = new Properties();
        try {
            p.load(EmpFactory.class.getClassLoader().getResourceAsStream("emp.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Emp getEmp() throws IllegalAccessException, InstantiationException {
        // 将emp.properties中存储到Properties集合中去
        // 通过反射，创建Emp对象
        // 获取Emp的Class对象
        Class<Emp> c = Emp.class;

        //通过Class获取对应类的无参的构造方法创建对象
        Emp emp = c.newInstance();

        //获取Emp对象中所有属性
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            //获取对应属性上的注解
            Value annotation = field.getDeclaredAnnotation(Value.class);


            //获取注解的取值，将注解的取值作为Properties集合的key
            String key = annotation.value();


            //根据指定的key获取对应的集合中的value值
            String value = p.getProperty(key);

            //因为所有属性都是private修饰，取消控制检查
            field.setAccessible(true);

            //为属性赋值
            field.set(emp, value);

        }

        return emp;
    }
}
